// 支持时间记忆功能的时钟程序

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // LCD地址：0x27（不显示则改为0x3F）
RTC_DS1307 RTC;

// 星期映射表（可选，无需可删除）
const char* weekDays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

void setup() {
  Wire.begin();
  lcd.init();
  lcd.backlight();  // 开启LCD背光（省电可注释）

  // 1. 检查DS1307模块是否正常连接
  if (!RTC.begin()) {
    lcd.setCursor(0, 0);
    lcd.print("RTC Connect Err");
    lcd.setCursor(0, 1);
    lcd.print("Check Wiring!");
    while (1);  // 连接失败暂停程序
  }

  // 2. 仅首次烧录时设置初始时间！
  // 烧录成功后务必注释这行（否则每次上电重置时间）
  // RTC.adjust(DateTime(2025, 11, 22, 14, 52, 30));  // 年-月-日
}

void loop() {
  DateTime now = RTC.now();  // 获取当前时间（断电后电池维持）

  // 第1行：日期 + 星期（可选）
  lcd.setCursor(1, 0);
  lcd.print(now.year());
  lcd.print('-');
  lcd.print(now.month() < 10 ? "0" : "");  // 不足两位补0
  lcd.print(now.month());
  lcd.print('-');
  lcd.print(now.day() < 10 ? "0" : "");
  lcd.print(now.day());
  lcd.print(' ');
  lcd.print(weekDays[now.dayOfTheWeek()]);  // 显示星期（0=周日）

  // 第2行：时间（时:分:秒）
  lcd.setCursor(3, 1);
  lcd.print(now.hour() < 10 ? "0" : "");
  lcd.print(now.hour());
  lcd.print(':');
  lcd.print(now.minute() < 10 ? "0" : "");
  lcd.print(now.minute());
  lcd.print(':');
  lcd.print(now.second() < 10 ? "0" : "");
  lcd.print(now.second());

  delay(1000);  // 每秒刷新，避免LCD闪烁
}